package com.example.TestCode.JavaBasics;

import java.util.ArrayList;
import java.util.List;

/**
 * @auther hewenhui
 * @see <a href="hetp://www.codingmaster.com> java </a>
 */
public class Demo {
    public static void main(String[] args) {
        // ### 字符串常量池 ###
        String s1 = "aaa"; // “aaa” 被存储在字符串常量池中
        String s2 = "aaa"; // 如果字符串常量池中有“aaa”,将s2直接只想“aaa”;如果没有就在字符串常量池中先创建“aaa”
        System.out.println(s1 == s2); // 结果为true,说明s1,s2这两个引用指向了同一个对象

        String s5 = new String(s1); // 凡是new()操作都会在堆中为对象开辟空间
        System.out.println(s5.equals(s1)); // 结果为true,因为两个字符串值相同
        System.out.println(s1 == s5); // 结果为false,一个在字符串常量池，一个在堆区

        System.out.println(s5.hashCode());
        s5 = s1 + s2; // 本质上也是new()操作
        System.out.println(s5.hashCode());
        // 前后s5.hashCode()不同，说明s5前后指向了不同的对象，应证了(s1+s2)实际上是new()了一个新对象。
        // s5 是 对象引用 存储的是对象的内存地址
        // 对象是内存中的一块区域，用于存储数据和执行操作


        // ### 三种字符串类型 ###
        String string = new String("hello");
        string.intern();
        StringBuffer buffer = new StringBuffer("abc");
        StringBuilder builder = new StringBuilder("123");

        // ### 包装类缓存 ###
        Integer a = 10;// 缓存范围内的整数，从缓存中获取
        Integer b= 10;// 缓存范围内的整数，从缓存中获取
        Integer c=128;//超出缓存范围，创建新的对象
        Integer d=128;// 超出缓存范围，创建新的对象
        System.out.println("a==b:"+(a == b));//输出:a ==b:true，因为a和b引用的是缓存中同一个
        System.out.println("c== d:"+(c== d));//输出:c==d:false，因为c和d是两个独立的对象

        // ### 擦除机制 ###
        List<String> list = new ArrayList<String>();

    }
}
